#ifndef BIBLIOTECA_H
#define BIBLIOTECA_H
#include "usuarios.h"
#include "libros.h"
#include "pedidoUsuario.h"
#include "pedidoBiblioteca.h"
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cctype>
#include <cstdio>
#include <fstream>
#include <list>
using namespace std;
class Biblioteca{
       Lista<Usuario> usuarios;
       Lista<Libro> libros;
       Lista<PedidoUsuario> pedidosUsuarios;
       Lista<PedidoBiblioteca> pedidosBiblioteca;
      
public :             
    Biblioteca();
    ~Biblioteca();
    
    void nuevoUsuario();    
    Usuario * nuevoUsuario(string logiN , string nombrE,string clavE);
    bool buscaUsuario(string log,string clav);    
    
    void cargaLibros(char *nombreFich);
    
    PedidoUsuario * creaPedidoUsuario(Usuario *usuario,Libro *libro, int prioridad);    
    Lista<PedidoUsuario>  buscaPedidosUsuarioPendientes(Usuario *usr);
    Lista<PedidoUsuario *>  buscaPedidosUsuarioPendientes();
    Lista<PedidoUsuario *>  buscaPedidosUsuarioTramitados();
    Lista<PedidoUsuario>  buscaPedidosUsuarioTramitados(Usuario *usr);

    void tramitaPedidoUsuario(PedidoUsuario *pedUsuario,PedidoBiblioteca *pedBiblioteca);
    void cierraPedidoBiblioteca(PedidoBiblioteca *pedidoBiblioteca);
    PedidoBiblioteca * abrePedidoBiblioteca();        
    
    Lista<PedidoBiblioteca>  buscaPedidosBibliotecaPendientes();
    Lista<PedidoBiblioteca>  buscaPedidosBibliotecaTramitados();                
            

//-------------- Funciones Auxiliares ----------------------------------------

    //libros
    Libro * buscaLibro(string nombreCampo,string valor);      
    Lista <Libro>  buscaLibros(string nombreCampo,string valor);    
    Lista <Libro> listaLibros(){return libros;}
        
    //usuarios
    void cambiarUsuarioClave(string claveNueva,Usuario *usrAux);    
    Usuario * buscaUsuario(string log);
    int buscaUsuario(Usuario *usu);
    void mostrarUsuarios();    
    Usuario * iniciarSesionUsuario(string logiN ,string clavE,int *validacion);    // kitar la validacion ya no sirve pana
    Usuario * primerUsuario(){/*return usuarios->lee(0);*/}
    Lista<Usuario> listaUsuarios(){return usuarios; }   
    
    //Pedidos usuario
    Lista<PedidoUsuario> listaPedidosUsuario(){return pedidosUsuarios;}
    
    //pedidosBiblioteca            
    void incluyePedidoBiblioteca(PedidoBiblioteca *pedBiblioteca);
    void pedirBibliotecaLibro(Usuario *usrSesion,Libro *nuevLib);
    Lista<PedidoBiblioteca> listaPedidosBiblioteca(){return pedidosBiblioteca;}
};

#endif
